#pragma once
#ifndef POLLER_H
#define POLLER_H
#include "NonCopyable.h"
#include "TimeStamp.h"
#include <vector>
#include <unordered_map>
namespace mymuduo {

class EventLoop;
class Channel;

// muduo 库中多路事件分发器的核心 I/O 复用模块
class Poller : NonCopyable{
public:
    using ChannelList = std::vector<Channel*>;
    Poller(EventLoop* loop);
    virtual ~Poller();
    // 给所有 I/O 复用保留统一的接口
    virtual TimeStamp poll(int timeoutMs, ChannelList* activeChannels) = 0;
    virtual void updateChannel(Channel *channel) = 0;
    virtual void removeChannel(Channel *channel) = 0;
    // 判断参数 channel 是否在当前 poller 当作
    virtual bool hasChannel(Channel* channel) const;
    // EventLoop 可以通过该接口获取默认的具体的 Poller 实例
    static Poller* newDefaultPoller(EventLoop* loop);
protected:
    // map 的 key 是 sockfd，value 是 sockfd 是所属的 channel 通道类型
    using ChannelMap = std::unordered_map<int, Channel*>;
    ChannelMap channels_;
private:
    EventLoop *ownerLoop_;
};

}

#endif